package com.hmob.hmdemo;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.hmob.hmsdk.ads.AdError;
import com.hmob.hmsdk.ads.splash.HMSplash;
import com.hmob.hmsdk.ads.splash.SplashListener;

import java.util.ArrayList;
import java.util.List;

public class SplashActivity extends AppCompatActivity {
    public static String TAG = SplashActivity.class.getSimpleName();
    private LinearLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        container = findViewById(R.id.container);

        // 如果targetSDKVersion >= 23，就要申请好权限。如果您的App没有适配到Android6.0（即targetSDKVersion < 23），那么只需要在这里直接调用fetchSplashAD接口。
        if (Build.VERSION.SDK_INT >= 23) {
            checkAndRequestPermission();
        } else {
            // 如果是Android6.0以下的机器，默认在安装时获得了所有权限，可以直接调用SDK
            fetchAd();
        }
    }

    private void fetchAd() {
        //1、创建广告对象
        HMSplash hmSplash = new HMSplash(Constants.ADID_SPLASH, container, 5000, new SplashListener() {
            /**
             * 广告加载失败，error对象包含了错误码和错误信息，错误码的详细内容可以参考文档
             */
            @Override
            public void onNoAd(AdError error) {
                Log.i(TAG, error.getErrorMessage());
                // 如果加载广告失败，则直接跳转
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            }

            /**
             * @param prior 是否优先展示
             * @return 是否立即展示，无特殊需求请返回true
             */
            @Override
            public boolean onReceived(boolean prior) {
                return true;
            }

            /**
             * 广告成功展示时调用，成功展示不等于满足计费条件（如展示时长尚未满足）
             */
            @Override
            public void onADPresent() {
                Log.i(TAG, "onADPresent");
            }

            /**
             * 广告关闭时调用，可能是用户关闭、展示时间到或用户点击了广告。
             * 此时一般需要跳过开屏的 Activity，进入应用内容页面
             */
            @Override
            public void onADDismissed() {
                Log.i(TAG, "onADDismissed");
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            }

            /**
             * 广告被点击时调用，不代表满足计费条件（如点击时网络异常）
             */
            @Override
            public void onADClicked() {
                Log.i(TAG, "onADClicked");
            }

            /**
             * 倒计时回调，返回广告还将被展示的剩余时间。
             * @param time 剩余毫秒数
             */
            @Override
            public void onADTick(int time) {
                Log.i(TAG, String.valueOf(time));
            }
        });
        //2、加载广告
        hmSplash.load(this);
    }


    /**
     * ----------非常重要----------
     * <p>
     * Android6.0以上的权限适配简单示例：
     * <p>
     * 如果targetSDKVersion >= 23，那么必须要申请到所需要的权限，再调用广点通SDK，否则广点通SDK不会工作。
     * <p>
     * Demo代码里是一个基本的权限申请示例，请开发者根据自己的场景合理地编写这部分代码来实现权限申请。
     * 注意：下面的`checkSelfPermission`和`requestPermissions`方法都是在Android6.0的SDK中增加的API，如果您的App还没有适配到Android6.0以上，则不需要调用这些方法，直接调用广点通SDK即可。
     */
    @TargetApi(Build.VERSION_CODES.M)
    private void checkAndRequestPermission() {
        List<String> lackedPermission = new ArrayList<String>();
        if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) {
            lackedPermission.add(Manifest.permission.READ_PHONE_STATE);
        }

        if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
            lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }

        if (!(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
            lackedPermission.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }

        // 权限都已经有了，那么直接调用SDK
        if (lackedPermission.size() == 0) {
            fetchAd();
        } else {
            // 请求所缺少的权限，在onRequestPermissionsResult中再看是否获得权限，如果获得权限就可以调用SDK，否则不要调用SDK。
            String[] requestPermissions = new String[lackedPermission.size()];
            lackedPermission.toArray(requestPermissions);
            requestPermissions(requestPermissions, 1024);
        }
    }

    private boolean hasAllPermissionsGranted(int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                return false;
            }
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) {
            fetchAd();
        } else {
            // 如果用户没有授权，那么应该说明意图，引导用户去设置里面授权。
            Toast.makeText(this, "应用缺少必要的权限！请点击\"权限\"，打开所需要的权限。", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
            finish();
        }
    }

    //防止用户返回键退出APP
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}
